package com.shxzz.easy12306.framework.starter.idempotent.core.handler;

import com.shxzz.easy12306.framework.starter.idempotent.annotation.Idempotent;
import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 抽象幂等处理器
 * <p>
 *     进一步定义幂等处理器逻辑处理流程
 * </p>
 * @author shxzz
 * @create 2024-02-22-22:04
 */
public abstract class AbstractIdempotentExecuteHandler implements IdempotentExecuteHandler {

    /**
     * 构建幂等参数
     * <p>
     *     构建幂等处理所需参数，以供幂等逻辑执行
     * </p>
     */
    protected abstract IdempotentParamWrapper buildIdempotentParam(ProceedingJoinPoint proceedingJoinPoint);

    @Override
    public void execute(ProceedingJoinPoint proceedingJoinPoint, Idempotent idempotent) {
        IdempotentParamWrapper idempotentParamWrapper = buildIdempotentParam(proceedingJoinPoint);
        idempotentParamWrapper.setIdempotent(idempotent);
        handler(idempotentParamWrapper);
    }

    /**
     * 核心幂等处理逻辑
     */
    protected abstract void handler(IdempotentParamWrapper idempotentParamWrapper);

}
